<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            ES6中引入了一种新的原始数据类型Symbol，它被归到基本数据类型中

            我们都知道在js中对象类型有个特点，那就是不能存在同名属性，只要出现同名，就会后者覆盖前者, 如果开发中你引入别人的库，结果一不小心给人家原有的东西覆盖了，那不就出问题了吗。
        */
        let obj1 = {
            name: 'mikaisa',
            sayName() {
                console.log(this.name);
            }
        }
        obj1.name = 'zzz'; //你这么一写，上面的obj1的name就被替换了
        console.log(obj1.name); //'zzz'

        // 我们来看看Symbol怎么去使用
        let s1 = Symbol(); //这样就生成了一个Symbol类型的数据，注意没有new
        let s2 = Symbol();
        console.log(s1 == s2); //false, 哪怕看上去好像一样，但是其实每个Symbol()都是独一无二的

        // 1. Symbol是不能运算的
        // console.log(s1++);//报错

        // 2. 显示调用toString()，不过这种转换其实没啥意义，都会转为'Symbol()'字符串
        console.log(s1.toString());
        console.log(s2.toString());

        // 3. 隐式转换Symbol
        if (s1) {
            console.log('1111');
        }

        // 假设这个obj2是你从哪里搞来的对象，你这样处理，就不怕你往obj2里加属性会覆盖原来的了
        let obj2 = {
            name: 'mikaisa'
        }
        let name = Symbol();
        obj2[name] = 'mikaisaaaa';
        console.log(obj2); //可以看到没有污染原来的name


        // 也可以这么用，更直观易读一些，Symbol()是可以传参的
        let keyss = {
            name: Symbol('name'),
            age: Symbol('age'),
        }
        let obj3 = {
            [keyss.name]: 'mikaisa',
            [keyss.age]: 18
        }
        obj3.name = 'mikaisaaaa';
        obj3.age = 188;
        console.log(obj3); //可以看到没有污染
    </script>
</body>

</html>